package com.shurdroides.proyectofinal.databasehelpers;

import java.io.ObjectInputStream.GetField;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;

import com.shurdroides.proyectofinal.R;
import com.shurdroides.proyectofinal.constants.Constants;
import com.shurdroides.proyectofinal.model.GridViewObject;
import com.shurdroides.proyectofinal.server.Helper;

public class DataHelper implements Constants.Database {

	SQLiteDatabase db;
	SQLiteQueryBuilder sqlBuilder;
	ContentValues cv;
	Context mContext;
	Class res;
	Field[] allDrawables;
	List<String> drawNames;
	List<Integer> drawIds;

	public DataHelper(Context context) {
		res = R.drawable.class;
		allDrawables = res.getFields();
		drawNames = new ArrayList<String>();
		drawIds = new ArrayList<Integer>();
		for (int aux = 0; aux < allDrawables.length; aux++) {
			try {
				drawNames.add(allDrawables[aux].getName());
				drawIds.add(allDrawables[aux].getInt(null));
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		OpenHelper oh = new OpenHelper(context);
		db = oh.getWritableDatabase();
		mContext = context;
	}

	public void removeAllFrom(String tableName) {
		db.execSQL("DELETE FROM " + tableName);
	}

	public boolean insertObject(int id, String nom, String foto, int peso,
			int cantidad_casa, int cantidad_inv, int duracion, int alimento,
			int duracionAbs) {
		cv = new ContentValues();
		boolean bool = true;

		cv.put(TABLA_OBJETO.COL_ID, id);
		cv.put(TABLA_OBJETO.COL_NAME, nom);
		cv.put(TABLA_OBJETO.COL_FOTO, foto);
		cv.put(TABLA_OBJETO.COL_PESO, peso);
		cv.put(TABLA_OBJETO.COL_CANTIDAD_CASA, cantidad_casa);
		cv.put(TABLA_OBJETO.COL_CANTIDAD_INV, cantidad_inv);
		cv.put(TABLA_OBJETO.COL_DURACION_ABS, duracion);
		cv.put(TABLA_OBJETO.COL_ALIMENTO, alimento);
		cv.put(TABLA_OBJETO.COL_DURACION, duracion);
		cv.put(TABLA_OBJETO.COL_DURACION_ABS, duracionAbs);
		try {
			db.insert(TABLA_OBJETO.TABLE_NAME, null, cv);
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean insertReceta(int id, int puntos) {
		cv = new ContentValues();
		boolean bool = true;

		cv.put(TABLA_RECETAS.COL_PUNTOS, puntos);
		cv.put(TABLA_RECETAS.COL_DESCUBIERTO, 0);
		cv.put(TABLA_RECETAS.COL_ID, id);
		try {
			db.insert(TABLA_RECETAS.TABLE_NAME, null, cv);
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean insertRes(int id, int id_obj, int id_receta, int cantidad) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_RESULTADOS.COL_ID, id);
		cv.put(TABLA_RESULTADOS.COL_ID_OBJETO, id_obj);
		cv.put(TABLA_RESULTADOS.COL_ID_RECETA, id_receta);
		cv.put(TABLA_RESULTADOS.COL_CANTIDAD, cantidad);
		try {
			db.insert(TABLA_RESULTADOS.TABLE_NAME, null, cv);
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean insertIngrediente(int id, int id_obj, int id_receta,
			int cantidad) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_INGREDIENTES.COL_ID, id);
		cv.put(TABLA_INGREDIENTES.COL_ID_OBJETO, id_obj);
		cv.put(TABLA_INGREDIENTES.COL_ID_RECETA, id_receta);
		cv.put(TABLA_INGREDIENTES.COL_CANTIDAD, cantidad);
		try {
			db.insert(TABLA_INGREDIENTES.TABLE_NAME, null, cv);
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean insertLogro(int id, int id_parent, int condicion,
			int adquirido, String habilidad, String nombre) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_LOGRO.COL_NOMBRE, nombre);
		cv.put(TABLA_LOGRO.COL_PARENT_ID, id_parent);
		cv.put(TABLA_LOGRO.COL_CONDICION, condicion);
		cv.put(TABLA_LOGRO.COL_ADQUIRIDO, adquirido);
		cv.put(TABLA_LOGRO.COL_HABILIDAD, habilidad);
		try {
			db.insert(TABLA_LOGRO.TABLE_NAME, null, cv);
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean insertUser(int id, String nombre, String mail, long latitud,
			long longitud, String clase, int puntos, int fuerza,
			int radioVision, int radioAccion, int caza, int robo) {

		cv = new ContentValues();
		boolean bool = true;

		cv.put(TABLA_USUARIO.COL_NOMBRE, nombre);
		cv.put(TABLA_USUARIO.COL_MAIL, mail);
		cv.put(TABLA_USUARIO.COL_LAT, latitud);
		cv.put(TABLA_USUARIO.COL_LONG, longitud);
		cv.put(TABLA_USUARIO.COL_CLASE, "Caveman");
		cv.put(TABLA_USUARIO.COL_PUNTOS, 10);
		cv.put(TABLA_USUARIO.COL_RADIO_VISION, 1500);
		cv.put(TABLA_USUARIO.COL_RADIO_ACCION, 750);
		cv.put(TABLA_USUARIO.COL_CAZA, 0);
		cv.put(TABLA_USUARIO.COL_ROBO, 50);
		try {
			db.insert(TABLA_USUARIO.TABLE_NAME, null, cv);
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updatePuntos(int puntos) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_PUNTOS, puntos);

		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateClase(String clase) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_CLASE, clase);

		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}

		return bool;
	}

	public boolean updateCaza(int puntos) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_CAZA, puntos);

		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateFuerza(int puntos) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_FUERZA_MAX, puntos);

		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateRobo(int puntos) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_ROBO, puntos);
		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateRadioA(int radio) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_RADIO_ACCION, radio);
		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateRadioV(int radio) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_RADIO_VISION, radio);
		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updatePosCueva(int lat, int lon) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_USUARIO.COL_LAT, lat);
		cv.put(TABLA_USUARIO.COL_LONG, lon);
		try {
			db.update(
					TABLA_USUARIO.TABLE_NAME,
					cv,
					TABLA_USUARIO.COL_ID + "= ?",
					new String[] { String.valueOf(Helper.getMyPreferences(
							mContext).getUserId()) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateDuracion(int id, int duracion, Integer cantidad_casa,
			int cantidad_inv, int generacio) {
		cv = new ContentValues();
		boolean bool = true;
		int newDuracion;

		switch (generacio) {
		case Constants.Generacio.CASA:
			cv.put(TABLA_OBJETO.COL_CANTIDAD_CASA, cantidad_casa);
			cv.put(TABLA_OBJETO.COL_CANTIDAD_INV, cantidad_inv);
			break;
		case Constants.Generacio.INV:
			cv.put(TABLA_OBJETO.COL_CANTIDAD_INV, cantidad_inv);
			break;
		}

		if (duracion == 0 && cantidad_inv + cantidad_casa > 0) {
			cv.put(TABLA_OBJETO.COL_DURACION, selectDuracionAbsObjeto(id));
		} else {
			cv.put(TABLA_OBJETO.COL_DURACION, duracion);
		}
		try {
			db.update(TABLA_OBJETO.TABLE_NAME, cv, TABLA_OBJETO.COL_ID + "= ?",
					new String[] { String.valueOf(id) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateCantidadInv(int id, int cantidad) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_OBJETO.COL_CANTIDAD_INV, cantidad);

		try {
			db.update(TABLA_OBJETO.TABLE_NAME, cv, TABLA_OBJETO.COL_ID + "= ?",
					new String[] { String.valueOf(id) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateCantidadCasa(int id, int cantidad) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_OBJETO.COL_CANTIDAD_CASA, cantidad);

		try {
			db.update(TABLA_OBJETO.TABLE_NAME, cv, TABLA_OBJETO.COL_ID + "= ?",
					new String[] { String.valueOf(id) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateRecetaDescubierta(int id) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_RECETAS.COL_DESCUBIERTO, 1);
		try {
			db.update(TABLA_RECETAS.TABLE_NAME, cv,
					TABLA_OBJETO.COL_ID + "= ?",
					new String[] { String.valueOf(id) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public boolean updateLogroAdquirido(int id) {
		cv = new ContentValues();
		boolean bool = true;
		cv.put(TABLA_LOGRO.COL_ADQUIRIDO, 1);
		try {
			db.update(TABLA_LOGRO.TABLE_NAME, cv, TABLA_LOGRO.COL_ID + "= ?",
					new String[] { String.valueOf(id) });
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	public Cursor[] selectInfoUsuario() {

		return new Cursor[] {
				db.query(TABLA_USUARIO.TABLE_NAME,
						new String[] { TABLA_USUARIO.COL_CAZA,
								TABLA_USUARIO.COL_CLASE,
								TABLA_USUARIO.COL_FUERZA_MAX,
								TABLA_USUARIO.COL_NOMBRE,
								TABLA_USUARIO.COL_PUNTOS,
								TABLA_USUARIO.COL_RADIO_ACCION,
								TABLA_USUARIO.COL_RADIO_VISION,
								TABLA_USUARIO.COL_ROBO }, null, null, null,
						null, null),
				db.query(TABLA_LOGRO.TABLE_NAME,
						new String[] { TABLA_LOGRO.COL_NOMBRE },
						TABLA_LOGRO.COL_ADQUIRIDO + "=?",
						new String[] { "" + 1 }, null, null, null) };
	}

	public int selectPuntosUsuario() {

		return db.query(TABLA_USUARIO.TABLE_NAME,
				new String[] { TABLA_USUARIO.COL_PUNTOS }, null, null, null,
				null, null).getInt(0);
	}

	public Cursor selectGetPosCasa() {
		return db.query(TABLA_USUARIO.TABLE_NAME, new String[] {
				TABLA_USUARIO.COL_LAT, TABLA_USUARIO.COL_LONG }, null, null,
				null, null, null);
	}

	public List<GridViewObject> selectObjetosInventario() {

		List<GridViewObject> array = new ArrayList<GridViewObject>();

		Cursor c = db.query(TABLA_OBJETO.TABLE_NAME, new String[] {
				TABLA_OBJETO.COL_ID, TABLA_OBJETO.COL_NAME,
				TABLA_OBJETO.COL_CANTIDAD_INV, TABLA_OBJETO.COL_DURACION,
				TABLA_OBJETO.COL_FOTO, TABLA_OBJETO.COL_PESO,
				TABLA_OBJETO.COL_ALIMENTO, TABLA_OBJETO.COL_DURACION_ABS },
				TABLA_OBJETO.COL_CANTIDAD_INV + " > 0", null, null, null, null,
				null);
		c.moveToFirst();
		try {
			do {
				array.add(new GridViewObject(
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ID)),
						c.getString(c.getColumnIndex(TABLA_OBJETO.COL_NAME)),
						getIdFoto(c.getString(c
								.getColumnIndex(TABLA_OBJETO.COL_FOTO))),
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_PESO)),
						0,
						c.getInt(c
								.getColumnIndex(TABLA_OBJETO.COL_CANTIDAD_INV)),
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ALIMENTO)),
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION)),
						c.getInt(c
								.getColumnIndex(TABLA_OBJETO.COL_DURACION_ABS))));
			} while (c.moveToNext());
		} catch (Exception e) {
		}
		return array;
	};

	public List<GridViewObject> selectObjetosCasa() {

		List<GridViewObject> array = new ArrayList<GridViewObject>();

		Cursor c = db.query(TABLA_OBJETO.TABLE_NAME, new String[] {
				TABLA_OBJETO.COL_ID, TABLA_OBJETO.COL_NAME,
				TABLA_OBJETO.COL_CANTIDAD_CASA, TABLA_OBJETO.COL_DURACION,
				TABLA_OBJETO.COL_FOTO, TABLA_OBJETO.COL_PESO,
				TABLA_OBJETO.COL_ALIMENTO, TABLA_OBJETO.COL_DURACION_ABS },
				TABLA_OBJETO.COL_CANTIDAD_CASA + ">?", new String[] { "" + 0 },
				null, null, null, null);
		c.moveToFirst();
		try {
			do {
				array.add(new GridViewObject(
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ID)),
						c.getString(c.getColumnIndex(TABLA_OBJETO.COL_NAME)),
						getIdFoto(c.getString(c
								.getColumnIndex(TABLA_OBJETO.COL_FOTO))),
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_PESO)),
						c.getInt(c
								.getColumnIndex(TABLA_OBJETO.COL_CANTIDAD_CASA)),
						0,
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ALIMENTO)),
						c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION)),
						c.getInt(c
								.getColumnIndex(TABLA_OBJETO.COL_DURACION_ABS))));
			} while (c.moveToNext());
		} catch (Exception e) {
		}
		return array;
	};

	public int selectPesoObjeto(int id) {

		return db.query(TABLA_OBJETO.TABLE_NAME,
				new String[] { TABLA_OBJETO.COL_PESO },
				TABLA_OBJETO.COL_ID + "=?", new String[] { "" + id }, null,
				null, null, null).getInt(0);
	}

	public int selectPesoTotal() {

		Cursor c = db.rawQuery("Select SUM(" + TABLA_OBJETO.TABLE_NAME + "."
				+ TABLA_OBJETO.COL_PESO + ") FROM " + TABLA_OBJETO.TABLE_NAME
				+ " WHERE " + TABLA_OBJETO.TABLE_NAME + "."
				+ TABLA_OBJETO.COL_CANTIDAD_INV + "=? ;",
				new String[] { "" + 1 });
		c.moveToFirst();
		return c.getInt(0);
	}

	public int selectAlimentoObjeto(int id) {
		Cursor c = db.query(TABLA_OBJETO.TABLE_NAME,
				new String[] { TABLA_OBJETO.COL_ALIMENTO }, TABLA_OBJETO.COL_ID
						+ "=?", new String[] { "" + id }, null, null, null,
				null);
		c.moveToFirst();
		return c.getInt(0);
	}

	public int selectDuracionAbsObjeto(int id) {
		Cursor c = db.query(TABLA_OBJETO.TABLE_NAME,
				new String[] { TABLA_OBJETO.COL_DURACION_ABS },
				TABLA_OBJETO.COL_ID + "=?", new String[] { "" + id }, null,
				null, null, null);
		c.moveToFirst();
		return c.getInt(0);
	}

	public int selectDuracionObjeto(int id) {
		Cursor c = db.query(TABLA_OBJETO.TABLE_NAME,
				new String[] { TABLA_OBJETO.COL_DURACION }, TABLA_OBJETO.COL_ID
						+ "=?", new String[] { "" + id }, null, null, null,
				null);
		c.moveToFirst();
		return c.getInt(0);
	}

	public int selectPuntosReceta(int id) {
		Cursor c = db.query(TABLA_RECETAS.TABLE_NAME,
				new String[] { TABLA_RECETAS.COL_PUNTOS }, TABLA_RECETAS.COL_ID
						+ "=" + String.valueOf(id), null, null, null, null);
		c.moveToFirst();
		return c.getInt(0);
	}

	public int selectCantidadInv(int id) {
		Cursor c = db.query(TABLA_OBJETO.TABLE_NAME,
				new String[] { TABLA_OBJETO.COL_CANTIDAD_INV },
				TABLA_OBJETO.COL_ID + "=" + String.valueOf(id), null, null,
				null, null);
		c.moveToFirst();
		return c.getInt(0);
	}

	@SuppressWarnings("finally")
	public int selectReceta(int[] ids, int[] quantitats) {
		int receta = -1;
		Cursor c;
		db.execSQL("CREATE TEMP TABLE IF NOT EXISTS ARRAY("
				+ TABLA_INGREDIENTES.COL_ID_OBJETO + " INTEGER PRIMARY KEY , "
				+ TABLA_INGREDIENTES.COL_CANTIDAD + " INTEGER);");

		for (int aux = 0; aux < ids.length; aux++) {
			db.execSQL("INSERT INTO ARRAY VALUES(" + ids[aux] + " ,"
					+ quantitats[aux] + ")");
		}
		try {

			String queryLluis = "SELECT " + TABLA_INGREDIENTES.COL_ID_RECETA
					+ " FROM " + TABLA_INGREDIENTES.TABLE_NAME + " GROUP BY  "
					+ TABLA_INGREDIENTES.COL_ID_RECETA
					+ " HAVING COUNT(*) = (SELECT COUNT(I."
					+ TABLA_INGREDIENTES.COL_ID_RECETA + ") FROM "
					+ TABLA_INGREDIENTES.TABLE_NAME
					+ " I LEFT JOIN ARRAY A ON I."
					+ TABLA_INGREDIENTES.COL_ID_OBJETO + "= A."
					+ TABLA_INGREDIENTES.COL_ID_OBJETO
					+ " WHERE EXISTS (SELECT "
					+ TABLA_INGREDIENTES.COL_ID_OBJETO + ", "
					+ TABLA_INGREDIENTES.COL_CANTIDAD + " FROM ARRAY WHERE I."
					+ TABLA_INGREDIENTES.COL_ID_OBJETO + "="
					+ TABLA_INGREDIENTES.COL_ID_OBJETO + " AND "
					+ TABLA_INGREDIENTES.COL_CANTIDAD + " = I."
					+ TABLA_INGREDIENTES.COL_CANTIDAD + ") GROUP BY "
					+ TABLA_INGREDIENTES.COL_ID_RECETA + " HAVING "
					+ TABLA_INGREDIENTES.TABLE_NAME + "."
					+ TABLA_INGREDIENTES.COL_ID_RECETA + " = I."
					+ TABLA_INGREDIENTES.COL_ID_RECETA + ")";

			// String query = "SELECT i." + TABLA_INGREDIENTES.COL_ID + ", i."
			// + TABLA_INGREDIENTES.COL_ID_RECETA + " FROM "
			// + TABLA_INGREDIENTES.TABLE_NAME + " i, ARRAY a WHERE i."
			// + TABLA_INGREDIENTES.COL_ID_OBJETO + " = a."
			// + TABLA_INGREDIENTES.COL_ID_OBJETO + " AND i."
			// + TABLA_INGREDIENTES.COL_CANTIDAD + "= a."
			// + TABLA_INGREDIENTES.COL_CANTIDAD
			// + " AND (SELECT COUNT(*) FROM "
			// + TABLA_INGREDIENTES.TABLE_NAME + " WHERE "
			// + TABLA_INGREDIENTES.TABLE_NAME + "."
			// + TABLA_INGREDIENTES.COL_ID_RECETA + " = i."
			// + TABLA_INGREDIENTES.COL_ID_RECETA + ") = " + ids.length;

			c = db.rawQuery(queryLluis, null);
			c.moveToFirst();
			// boolean bool = true;
			// int count = 0;
			receta = c.getInt(c
					.getColumnIndex(TABLA_INGREDIENTES.COL_ID_RECETA));
			// do {
			// count++;
			// bool = bool
			// && receta == c
			// .getInt(c
			// .getColumnIndex(TABLA_INGREDIENTES.COL_ID_RECETA));
			// } while (c.moveToNext() && bool);
			// receta = bool && count == ids.length ? receta : -1;
		} catch (Exception e) {
			receta = -1;
		} finally {
			db.execSQL("DROP TABLE IF EXISTS ARRAY");
			return receta;
		}

	}

	public ArrayList<GridViewObject> selectResultadosReceta(int id) {
		ArrayList<GridViewObject> list = new ArrayList<GridViewObject>();
		String query = "SELECT * FROM " + TABLA_OBJETO.TABLE_NAME + ", "
				+ TABLA_RESULTADOS.TABLE_NAME + " WHERE "
				+ TABLA_RESULTADOS.TABLE_NAME + "."
				+ TABLA_RESULTADOS.COL_ID_OBJETO + " = "
				+ TABLA_OBJETO.TABLE_NAME + "." + TABLA_OBJETO.COL_ID + " AND "
				+ TABLA_RESULTADOS.TABLE_NAME + "."
				+ TABLA_RESULTADOS.COL_ID_RECETA + " = " + String.valueOf(id);

		Cursor c = db.rawQuery(query, null);
		c.moveToFirst();
		do {
			list.add(new GridViewObject(c.getInt(c
					.getColumnIndex(TABLA_RESULTADOS.COL_ID_OBJETO)), c
					.getString(c.getColumnIndex(TABLA_OBJETO.COL_NAME)),
					getIdFoto(c.getString(c
							.getColumnIndex(TABLA_OBJETO.COL_FOTO))), c
							.getInt(c.getColumnIndex(TABLA_OBJETO.COL_PESO)),
					0,
					c.getInt(c.getColumnIndex(TABLA_RESULTADOS.COL_CANTIDAD)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ALIMENTO)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION_ABS)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION_ABS))));
		} while (c.moveToNext());

		return list;
	}

	public int selectIdLogro(int condicio, String habilitat) {

		return db.query(
				TABLA_LOGRO.TABLE_NAME,
				new String[] { TABLA_LOGRO.COL_ID },
				TABLA_LOGRO.COL_CONDICION + "<=? AND "
						+ TABLA_LOGRO.COL_HABILIDAD + " = ?" + " AND "
						+ TABLA_LOGRO.COL_ADQUIRIDO + " = ?",
				new String[] { String.valueOf(condicio),
						String.valueOf(habilitat), String.valueOf(0) }, null,
				null, null).getInt(0);

	}

	public int selectParentLogro(int id) {
		return db.query(TABLA_LOGRO.TABLE_NAME,
				new String[] { TABLA_LOGRO.COL_PARENT_ID },
				TABLA_LOGRO.COL_ID + "<=?",
				new String[] { String.valueOf(id) }, null, null, null)
				.getInt(0);
	}

	public Cursor selectObjetosInventarioGrid() {

		return db.query(TABLA_OBJETO.TABLE_NAME, null,
				TABLA_OBJETO.COL_CANTIDAD_INV + ">?", new String[] { "" + 0 },
				null, null, null, null);
	}

	public List<GridViewObject> selectAllObjetosAct() {
		List<GridViewObject> array = new ArrayList<GridViewObject>();
		String query = "SELECT " + TABLA_OBJETO.COL_ID + ", "
				+ TABLA_OBJETO.COL_FOTO + ", " + TABLA_OBJETO.COL_PESO + ", "
				+ TABLA_OBJETO.COL_NAME + "," + TABLA_OBJETO.COL_CANTIDAD_CASA
				+ ", " + TABLA_OBJETO.COL_CANTIDAD_INV + ", "
				+ TABLA_OBJETO.COL_DURACION + ", " + TABLA_OBJETO.COL_PESO
				+ ", " + TABLA_OBJETO.COL_DURACION_ABS + ", "
				+ TABLA_OBJETO.COL_ALIMENTO + " FROM "
				+ TABLA_OBJETO.TABLE_NAME + " GROUP BY " + TABLA_OBJETO.COL_ID
				+ " HAVING SUM(" + TABLA_OBJETO.COL_CANTIDAD_CASA + " + "
				+ TABLA_OBJETO.COL_CANTIDAD_INV + ") > 0";
		Cursor c = db.rawQuery(query, null);
		c.moveToFirst();

		do {
			array.add(new GridViewObject(c.getInt(c
					.getColumnIndex(TABLA_OBJETO.COL_ID)), c.getString(c
					.getColumnIndex(TABLA_OBJETO.COL_NAME)), getIdFoto(c
					.getString(c.getColumnIndex(TABLA_OBJETO.COL_FOTO))), c
					.getInt(c.getColumnIndex(TABLA_OBJETO.COL_PESO)), c
					.getInt(c.getColumnIndex(TABLA_OBJETO.COL_CANTIDAD_CASA)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_CANTIDAD_INV)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ALIMENTO)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION_ABS))));
		} while (c.moveToNext());
		return array;
	}

	public List<GridViewObject> selectAllObjetos() {
		List<GridViewObject> array = new ArrayList<GridViewObject>();
		String query = "SELECT * FROM " + TABLA_OBJETO.TABLE_NAME;
		Cursor c = db.rawQuery(query, null);
		c.moveToFirst();

		do {
			array.add(new GridViewObject(c.getInt(c
					.getColumnIndex(TABLA_OBJETO.COL_ID)), c.getString(c
					.getColumnIndex(TABLA_OBJETO.COL_NAME)), getIdFoto(c
					.getString(c.getColumnIndex(TABLA_OBJETO.COL_FOTO))), c
					.getInt(c.getColumnIndex(TABLA_OBJETO.COL_PESO)), c
					.getInt(c.getColumnIndex(TABLA_OBJETO.COL_CANTIDAD_CASA)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_CANTIDAD_INV)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ALIMENTO)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION_ABS))));
		} while (c.moveToNext());
		return array;
	}

	public GridViewObject selectObjectoByName(String name) {
		String query = "SELECT * FROM " + TABLA_OBJETO.TABLE_NAME + " WHERE "
				+ TABLA_OBJETO.COL_NAME + "='" + name+"'";

		Cursor c = db.rawQuery(query, null);
		if (c.moveToFirst())
			return new GridViewObject(c.getInt(c
					.getColumnIndex(TABLA_OBJETO.COL_ID)), c.getString(c
					.getColumnIndex(TABLA_OBJETO.COL_NAME)),
					getIdFoto(c.getString(c
							.getColumnIndex(TABLA_OBJETO.COL_FOTO))),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_PESO)), 0,
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_CANTIDAD_INV)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_ALIMENTO)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION)),
					c.getInt(c.getColumnIndex(TABLA_OBJETO.COL_DURACION_ABS)));
		else
			return null;
	}

	public int getIdFoto(String name) {
		return drawIds.get(drawNames.indexOf(name));
	}

}